/*(C) Copyright

    This file is part of GastosMovil.
    
    GastosMovil is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    GastosMovil is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GastosMovil.  If not, see <http://www.gnu.org/licenses/>.
    
    Autor: Antonio Cristóbal Álvarez Abellán -> acabellan@gmail.com
    
    */

package deeloco.android.gastos.Movil.plus;

import java.util.Date;

import deeloco.android.gastos.Movil.plus.broadcast.avisoEstadoTelefono;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

/**
 * 
 * @author Antonio Critóbal Álvarez Abellán
 * 
 * La clase genera la vista correspondiente al widget, devolviendo un remoteview con los datos actualizados.
 *
 */
public class actualizarWidget {
	
	Context contexto;
	private tarifas ts=null;
	static final String PREFERENCIAS_WIDGET="MIS_PREFERENCIAS_WIDGET";
	static final String PREF_NUMERO="NUMERO_ULTIMA";
	private int ordenTarifaAMostrar=0; //Identificar de la tarifa cuyos datos se van a mostrar en el widget
	private boolean debugger=true;
	private int layout;
	
	
	 public actualizarWidget(Context c,int layout) {
	     ts=new tarifas();
	     ts.cargarTarifas();
		 this.contexto=c;
		 this.layout=layout;
		 //Recuperamos el orden de la tarifa a mostrar
		ValoresPreferencias vp=new ValoresPreferencias(this.contexto);
		int ordenRecuperado=vp.recuperarPreferencesInt("ordenTarifaAMostrar");
		if (ordenRecuperado!=-9999)
			this.ordenTarifaAMostrar=ordenRecuperado;
	}


	/**
	    * Función que se encarga de actualizar los elementos del interface del widget, con los valores de la primera tarifa.
	    * @param context
	    * @return RemoteView
	    * 	Vista remota con todos los elementos del widget actualizados.
	    */
	 
 		public RemoteViews buildUpdate()
 		{
 			if (this.layout==R.layout.widget1x1)
				return buildUpdate_widget1x1(this.contexto);
 			return buildUpdate_widget3x2(this.contexto);
 		}
	 
 		/**
 		 * Actualiza los valores del widget con los datos de la tarifa actual o con la siguiente
 		 * @param siguiente. true -> siguiente tarifa a la actual. False -> la actual
 		 * @return
 		 */
 		public RemoteViews buildUpdate(boolean siguiente)
 		{ 
 			
 			ValoresPreferencias vp=new ValoresPreferencias(this.contexto);
 			if (debugger) Log.d("actualizarWidget.java", "Siguiente -> "+siguiente+" orden antes "+this.ordenTarifaAMostrar+" condicion "+(this.ordenTarifaAMostrar<(ts.numTarifas()-1)));

 			if (siguiente)
 			{
 				if (this.ordenTarifaAMostrar<(ts.numTarifas()-1))
 				{
 					this.ordenTarifaAMostrar++;
 				}
 				else
 				{
 					this.ordenTarifaAMostrar=0;
 				}
 				
 				if (debugger) Log.d("actualizarWidget.java", "orden despues ELSE "+this.ordenTarifaAMostrar);
 				
 	 			if (this.ordenTarifaAMostrar>=(ts.numTarifas()))
 					this.ordenTarifaAMostrar=0;
 	 			
 				vp.guardarPreferences("ordenTarifaAMostrar", this.ordenTarifaAMostrar);
 	 			if (debugger) Log.d("actualizarWidget.java", "orden despues "+this.ordenTarifaAMostrar);
 				
 			}
 			
 			//PROBAR
// 			if (! ts.existeTarifa(this.ordenTarifaAMostrar)) this.ordenTarifaAMostrar=ts.getIdentificarPrimeraTarifa();
 			
 			//ALARMAS
 			GestorNotificaciones alarma=new GestorNotificaciones(contexto, 0);
 			alarma.comprobarNotificaciones();
 			
 			return buildUpdate_widget3x2(this.contexto);
 		}
		
		/**
		 * Actualiza los datos del widget de 4x1
		 * @param context
		 * @return
		 */
		public RemoteViews buildUpdate_widget3x2(Context context) 
		{
			
			RemoteViews updateViews = new RemoteViews(context.getPackageName(), this.layout);
			
			try
			{
			
				//Actualizamos los campos del widget 1x1
				if (this.layout==R.layout.widget1x1)
					return buildUpdate_widget1x1(context);
				
				//Actualizamos los campos del widget 3x2
			   
		       //RemoteViews updateView = null;
		       ValoresPreferencias vp=new ValoresPreferencias(context);
	//	       RemoteViews updateViews = new RemoteViews(context.getPackageName(), this.layout);
		       String telefono;
		       String fechaHora;
		       int duracion;
		       String nombre="";
		       String coste;
		       SharedPreferences preferencias = context.getSharedPreferences(PREFERENCIAS_WIDGET, Context.MODE_PRIVATE);
	//	       if (debugger) Log.d("actualizarWidget.java","Inicialización de variables");
		       if (preferencias!=null)
		       {
		    	   //Recupero los datos de la última llamada
		    	   telefono=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_NUMERO);
		    	   fechaHora=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_FECHA);
		    	   nombre=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_NOMBRE);
		    	   duracion=vp.recuperarPreferencesInt(avisoEstadoTelefono.PREF_DURACION);
		    	   coste=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_COSTE);
		    	   if (debugger) Log.d("actualizarWidget.java","Recuperar los datos de la última llamada");
					//Actulizamos los datos de la ultima llamada
			       	if (nombre==null)
			       	{
			       		String formatoTelefono = telefono.substring(0,telefono.length()-6)+"\n"+telefono.substring(telefono.length()-6);
			       		updateViews.setTextViewText(R.id.txt_numero, formatoTelefono); //No tiene nombre de contactos
			       		
			       	}
			       	else
			       	{
			       		//Truncamos el nombre si tiene más de 12 caracteres
			       		//String nombreFormato = nombre.substring(0,nombre.indexOf(" "))+"\n"+nombre.substring(nombre.indexOf(" "));
				       	updateViews.setTextViewText(R.id.txt_numero, nombre);
			       	}
		       	
			       	try
			       	{
						updateViews.setTextViewText(R.id.txt_duracion, ""+FunGlobales.segundosAHoraMinutoSegundo(duracion));
						updateViews.setTextViewText(R.id.txt_fecha, fechaHora.substring(0, 5)+" "+fechaHora.substring(11, 16));
						updateViews.setTextViewText(R.id.txt_coste, coste+FunGlobales.monedaLocal());
			       	}
			       	catch (Exception e)
			       	{
			       		updateViews.setTextViewText(R.id.txt_numero, "SIN DATOS");
						updateViews.setTextViewText(R.id.txt_duracion, "");
						updateViews.setTextViewText(R.id.txt_fecha, "");
						updateViews.setTextViewText(R.id.txt_coste, "");
			       	}
			       	if (debugger) Log.d("actualizarWidget.java","Actualizamos los datos en el widget");
			       	
					//Recuperamos el valor guardado en preferencias de los totales mensuales
			       	
					if (debugger) Log.d("actualizarWidget.java", "COSTE TOTAL MES RECUPERADO="+vp.recuperarPreferencesString("costeTotalMes"));
					String costeTotalMes=vp.recuperarPreferencesString("costeTotalMes");
					costeTotalMes=(costeTotalMes==null)?"0.0":costeTotalMes;
					updateViews.setTextViewText(R.id.txt_costeTotalMes, costeTotalMes+FunGlobales.monedaLocal());
					
					int i=this.ordenTarifaAMostrar;
					
	
					if (debugger) Log.d("actualizarWidget.java", "Indice="+i);
					
					int segMes=0;
					int segLimiteMes=0;
					int limite=0;
					String costeMes="Sin Datos";
					String nombreTarifa="Sin Datos";
					String minutosMes="";
					
					try
					{
		    			segMes = vp.recuperarPreferencesInt(ts.getTarifas().get(i).getNombre()+"_segConsumidosMes");
		    			segLimiteMes = vp.recuperarPreferencesInt(ts.getTarifas().get(i).getNombre()+"_segConsumidosLimiteMes");
		    			costeMes=vp.recuperarPreferencesString(ts.getTarifas().get(i).getNombre()+"_costeMes");
		    			costeMes=(costeMes==null)?"Sin Datos":costeMes+FunGlobales.monedaLocal();
		    			limite=ts.getTarifas().get(i).getLimite()*60;
		    			if (debugger) Log.d("actualizarWidget.java","Recuperamos los valores de totales y de la tarifa");
		    			nombreTarifa=ts.getTarifas().get(i).getNombre();
					}
					catch (IndexOutOfBoundsException e)
					{
						Log.e("actualizarWidget.java",e.getMessage());
						costeMes="Sin Datos";
						nombreTarifa="Sin Datos";
					}
	    			updateViews.setTextViewText(R.id.txt_mes, vp.getPreferenciasMesTexto(5,(vp.getPreferenciasInicioMes()>1)));
	    			updateViews.setTextViewText(R.id.txt_nombreTarifa, nombreTarifa);
	//    			updateViews.setTextViewText(R.id.gastoMes, costeMes);
	    			updateViews.setTextViewText(R.id.txt_gastoMes, costeMes);
	
	    			if (segMes==-9999)
	    				updateViews.setTextViewText(R.id.txt_duracion, "SIN DATOS");
	    			else
	    			{
	//    				updateViews.setTextViewText(R.id.txt_segMes, ""+FunGlobales.segundosAHoraMinutoSegundo(segMes));
	    				minutosMes=FunGlobales.segundosAMinutoSegundo(segMes);
	    				updateViews.setTextViewText(R.id.txt_segMes, minutosMes);
	    			}
	    			
	    			double porcentaje=120; //Lo pongo a un porcentaje > 100, para que si no tiene limite del mes, dibuje gris los cuadros de gasto
	    			if (segLimiteMes>-1) //Tiene segundos consumidos del limite
	    			{
	    				//Tiene Límite del Mes
	    				
	    				//double porcentaje=(segLimiteMes/(ts.getTarifas().get(i).getLimite()*60));
	    				if (segLimiteMes<=limite)
	    				{
	    					//No se ha sobrepasado el limite
	    					porcentaje=((double)segLimiteMes/(double)limite)*100;
	//    					updateViews.setTextViewText(R.id.txt_porcientoMes, ""+(int)FunGlobales.redondear((100-porcentaje), 0)+"%");
	    					Log.d("----","Numero de tarifas="+ts.getTarifas().size());
							minutosMes+=" \nde "+ts.getTarifas().get(i).getLimite()+" m.";
	    					
	    				}
	    				else
	    				{
	    					porcentaje=100.0;
	//    					updateViews.setTextViewText(R.id.txt_porcientoMes, ""+(int)FunGlobales.redondear((100-porcentaje), 0)+"% | :-(");
	    					minutosMes+=" \nde "+ts.getTarifas().get(i).getLimite()+"m. :-(";
	    				}
	    				updateViews.setTextViewText(R.id.txt_segMes, minutosMes);
	
	    				updateViews.setInt(R.id.porcientoMes9, "setBackgroundColor", ((100-porcentaje)<=90 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes8, "setBackgroundColor", ((100-porcentaje)<=80 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes7, "setBackgroundColor", ((100-porcentaje)<=70 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes6, "setBackgroundColor", ((100-porcentaje)<=60 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes5, "setBackgroundColor", ((100-porcentaje)<=50 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes4, "setBackgroundColor", ((100-porcentaje)<=40 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes3, "setBackgroundColor", ((100-porcentaje)<=30 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#088A08")));
	    				updateViews.setInt(R.id.porcientoMes2, "setBackgroundColor", ((100-porcentaje)<=20 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor(((100-porcentaje)<30)?"#FF0000":"#088A08")));
	    				updateViews.setInt(R.id.porcientoMes1, "setBackgroundColor", ((100-porcentaje)<=10 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor(((100-porcentaje)<30)?"#FF0000":"#088A08")));
	    				updateViews.setInt(R.id.porcientoMes0, "setBackgroundColor", ((100-porcentaje)<=0 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor(((100-porcentaje)<30)?"#FF0000":"#088A08")));
	    			}
	    			else
	    			{
	    				//No tiene límite
	    				updateViews.setInt(R.id.porcientoMes9, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes8, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes7, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes6, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes5, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes4, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes3, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes2, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes1, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    				updateViews.setInt(R.id.porcientoMes0, "setBackgroundColor", android.graphics.Color.parseColor("#00000000"));
	    			}
	    			
	    			//Diagrama de barra de los días que llevamos del periodo de facturación
	    			Date hoy=new Date();
	    	    	int dia=hoy.getDate();
	    	    	int inicioFac=vp.getPreferenciasInicioMes();
	    	    	int diaRelativo=0;
	    	    	if (inicioFac<=dia)
	    	    	{
	    	    		diaRelativo=(((dia)*100-(inicioFac-1)*100)/30);
	    	    	}
	    	    	else
	    	    	{
	    	    		diaRelativo=(((30-inicioFac)*100+(dia+1)*100)/30);	
	    	    	}
	    	    	
	    	    	Log.d(".....","Dia relativo - % "+diaRelativo);   
	    			updateViews.setInt(R.id.porcientoDias9, "setBackgroundColor", ((100-diaRelativo)<=90 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias8, "setBackgroundColor", ((100-diaRelativo)<=80 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias7, "setBackgroundColor", ((100-diaRelativo)<=70 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias6, "setBackgroundColor", ((100-diaRelativo)<=60 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias5, "setBackgroundColor", ((100-diaRelativo)<=50 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias4, "setBackgroundColor", ((100-diaRelativo)<=40 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias3, "setBackgroundColor", ((100-diaRelativo)<=30 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias2, "setBackgroundColor", ((100-diaRelativo)<=20 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias1, "setBackgroundColor", ((100-diaRelativo)<=10 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
					updateViews.setInt(R.id.porcientoDias0, "setBackgroundColor", ((100-diaRelativo)<0 ? android.graphics.Color.parseColor("#99000000"):android.graphics.Color.parseColor("#FFFFFF")));
	    			
	    			if (debugger) Log.d("actualizarWidget.java","Actualizamos los datos de los totales y de la tarifa");
	    			
					
					if (debugger) Log.d("actualizarWidget.java","Inicialización la barra de proceso");
					//Evento onClick en el widget d
					
					if (vp.getComportamientoWidget()&&(telefono!=null))
					{
						//Arrancamos el dialer
						String number = "tel:" + telefono.trim();
						Intent launchIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(number));
						PendingIntent pIntent = PendingIntent.getActivity(context, 0, launchIntent, 0);
						updateViews.setOnClickPendingIntent(R.id.datosLlamadaDerecha, pIntent);
						
					}
					else
					{
						//Arrancamos gastos móvil
	
						Intent launchIntent = new Intent(context,gastoMovil.class);
				      	PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
			  			updateViews.setOnClickPendingIntent(R.id.datosLlamadaDerecha, intent);
						
					}
					//Evento onClick en el widget, para actualización manual
			  		//Intent intentUpdate = new Intent("MY_OWN_WIDGET_UPDATE");
	//				Intent intentUpdate = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
					Intent intentUpdate = new Intent("ACTUALIZAR_WIDGET");
			  		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentUpdate, 0);
			  		updateViews.setOnClickPendingIntent(R.id.datosMesDerecha, pendingIntent);
			  		if (debugger) Log.d("actualizarWidget.java","Comportamiento del widget a los click");
			  		
					
			   }
			}
			catch (IndexOutOfBoundsException i)
			{
				if (ts.numTarifas()==0)
					Toast.makeText(context,context.getString(R.string.app_name_abrev)+": No hay tarifas definidas.",Toast.LENGTH_LONG).show();
				else
					Toast.makeText(context,context.getString(R.string.app_name_abrev)+": Problemas para acceder a las tarifas.",Toast.LENGTH_LONG).show();
			}
			catch (Exception e)
			{
				
			}
			
	       return updateViews;
	   }

		
		/**
		 * Actualiza los datos del widget de 1x1
		 * @param context
		 * @return
		 */
		public RemoteViews buildUpdate_widget1x1(Context context) 
		{
			 RemoteViews updateViews = new RemoteViews(context.getPackageName(), this.layout);
			 
			//RemoteViews updateView = null;
		       ValoresPreferencias vp=new ValoresPreferencias(context);
		       String telefono="";
		       String fechaHora;
		       int duracion;
		       String nombre="";
		       String coste;
		       SharedPreferences preferencias = context.getSharedPreferences(PREFERENCIAS_WIDGET, Context.MODE_PRIVATE);
//		       if (debugger) Log.d("actualizarWidget.java","Inicialización de variables");
		       if (preferencias!=null)
		       {
		    	   //Recupero los datos de la última llamada
		    	   telefono=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_NUMERO);
		    	   fechaHora=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_FECHA);
		    	   nombre=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_NOMBRE);
		    	   duracion=vp.recuperarPreferencesInt(avisoEstadoTelefono.PREF_DURACION);
		    	   coste=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_COSTE);
		    	   String costeTotalMes=vp.recuperarPreferencesString("costeTotalMes");
			        //Actulizamos los datos de la ultima llamada
			       	if (nombre==null)
			       		updateViews.setTextViewText(R.id.txt_numero, telefono); //No tiene nombre de contactos
			       	else
			       		//Truncamos el nombre si tiene más de 12 caracteres
				       	if (nombre.length()>20)
				       		updateViews.setTextViewText(R.id.txt_numero, nombre.subSequence(0, 20)+"...");
				       	else
				       		updateViews.setTextViewText(R.id.txt_numero, nombre);
		       	
			       	try
			       	{
						updateViews.setTextViewText(R.id.txt_duracion, ""+FunGlobales.segundosAHoraMinutoSegundo(duracion));
						updateViews.setTextViewText(R.id.txt_fecha, fechaHora.substring(0, 5)+" "+fechaHora.substring(11, 16));
						updateViews.setTextViewText(R.id.txt_coste, coste+FunGlobales.monedaLocal());
						updateViews.setTextViewText(R.id.txt_totalMes, costeTotalMes+FunGlobales.monedaLocal());
			       	}
			       	catch (Exception e)
			       	{
			       		updateViews.setTextViewText(R.id.txt_numero, "SIN DATOS");
						updateViews.setTextViewText(R.id.txt_duracion, "");
						updateViews.setTextViewText(R.id.txt_fecha, "");
						updateViews.setTextViewText(R.id.txt_coste, "");
						updateViews.setTextViewText(R.id.txt_totalMes, "000.0 €");
			       	}
			       	
		       }
		       
		       if (vp.getComportamientoWidget()&&(telefono!=null))
				{
					//Arrancamos el dialer
					String number = "tel:" + telefono.trim();
					Intent launchIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(number));
					PendingIntent pIntent = PendingIntent.getActivity(context, 0, launchIntent, 0);
					updateViews.setOnClickPendingIntent(R.id.datosLlamadaDerecha, pIntent);
					
				}
				else
				{
					//Arrancamos gastos móvil
					Intent launchIntent = new Intent(context,gastoMovil.class);
			      	PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
		  			updateViews.setOnClickPendingIntent(R.id.datosLlamadaDerecha, intent);
					
				}
		       
		       return updateViews;
			       	
		}

}
